/*
核心算法的一种实现，
实现了功能，但是简单粗暴，不优雅

@param  skus         array   可用的sku数组
@param  attr_array   obj     属性表 
@param  now_select   obj     当前已确定的属性
@param  e            obj     当前点击的属性

@return allowed_buttons         array   所有【能】点击的按钮
@return not_allowed_buttons     array   所有【不能】点击的按钮

思路是这样
1.初始化的时候，就筛选一遍，怎么样都不可能点的按钮，永远禁用
2.点选后进行计算，以属性值为单位进行计算，每个属性值与每个按钮一一对应
具体计算的方法分2种情况，1每个属性都已经有选择，2没有都选择
    2.1每个属性都选择了，
    计算方法时比对【已选择的属性组合】与【所有sku组合】，比对出有1个属性不同，其余都相同的sku，并把这个属性值取出，这就是可点击的按钮
    2.2不是每个属性都点选了
    计算的按钮限制为，除了当前属性的其他属性，比对【已选择的属性组合】与【所有sku组合】，比对出完全匹配的sku，并将有的属性值取出，为可选
    （全用第二种会出现一种bug，就是你选中每个属性后，其他都不能选了）   
*/

function caculate_button(skus,attr_array,now_select,e){
    var is_all_select = obj_length(attr_array)==obj_length(now_select);
    if(is_all_select){
        console.log('完全选择模式----');
        //得到所有未选择的按钮
        let[selected_buttons,not_selected_buttons] = selected_or_not_buttons(attr_array,now_select,{},true)
        console.log('not_selected_buttons',not_selected_buttons);
        //计算匹配差1的sku
        var almost_matched_skus_array = almost_matched_skus(skus,now_select);
        //计算匹配的sku中，所有的属性值(按钮)
        var can_use_buttons = get_can_use_buttons(almost_matched_skus_array);
        var can_not_use_buttons = array_diff(not_selected_buttons,can_use_buttons);
    }else{
        console.log('没有完全选择模式----');
        //计算除当前属性区外，已选择和没选择的属性值(按钮)数组
        let[selected_buttons,not_selected_buttons] = selected_or_not_buttons(attr_array,now_select,e)
        //计算匹配的sku
        var matched_skus_array = matched_skus(skus,now_select);
        //计算匹配的sku中，所有的属性值(按钮)
        var can_use_buttons = get_can_use_buttons(matched_skus_array);
        var can_not_use_buttons = array_diff(not_selected_buttons,can_use_buttons);
        can_use_buttons = array_diff(not_selected_buttons,can_not_use_buttons);
    }
    console.log('can_use_buttons',can_use_buttons);
    console.log('can_not_use_buttons',can_not_use_buttons);
    return [can_use_buttons,can_not_use_buttons];
}
function selected_or_not_buttons(attr_array,now_select,e,is_all_select=false){
    var all = [];
    var selected_buttons = [];
    var not_selected_buttons = [];
    for(var attr_name in attr_array) {   
        if(is_all_select){
            attr_array[attr_name].forEach(one_attr_value=>{
                all.push(attr_name+'-'+one_attr_value);
            });
        }else{
            if(now_select[attr_name]==undefined){//非当前选择的属性
                attr_array[attr_name].forEach(one_attr_value=>{
                    all.push(attr_name+'-'+one_attr_value);
                });
            }     
        } 
    }
    for(var n_attr_name in now_select) {       
        selected_buttons.push(n_attr_name+'-'+now_select[n_attr_name]);
    }
    not_selected_buttons = array_diff(all,selected_buttons);
    // console.log('--selected_or_not_buttons----------------');
    // console.log('now_select',now_select);
    // console.log('除去当前选区的所有按钮',all);
    // console.log('已选按钮',selected_buttons);
    // console.log('未选按钮',not_selected_buttons);
    return [selected_buttons,not_selected_buttons];
}
function matched_skus(skus,now_select){
    //匹配，所有sku中，已经确定的属性都符合的，还存在的按钮，就是能点击的，不然就是不能点击的
    var matched_skus_array = [];
    skus.forEach(one_sku=>{
        //已选属性 匹配 sku
        var all_macth = true;
        for(var n_attr_name in now_select){
            if(one_sku.attr[n_attr_name] != now_select[n_attr_name]){
                all_macth = false;//但凡有一条不对就不匹配
            }
        }
        if(all_macth && one_sku.stock>0){
            matched_skus_array.push(one_sku);
        }
    });
    // console.log('--matched_skus----------------');
    // console.log('now_select',now_select);
    // console.log('matched_skus_array',matched_skus_array);
    return matched_skus_array;
}
function almost_matched_skus(skus,now_select){
    //匹配，所有sku中，已经确定的属性都符合的，还存在的按钮，就是能点击的，不然就是不能点击的
    var matched_skus_array = [];
    skus.forEach(one_sku=>{
        //已选属性 匹配 sku
        var not_match_number = 0;
        for(var n_attr_name in now_select){
            if(one_sku.attr[n_attr_name] != now_select[n_attr_name]){
                not_match_number = not_match_number+1;
            }
        }
        if(not_match_number==1 && one_sku.stock>0){
            matched_skus_array.push(one_sku);
        }
    });
    // console.log('--almost_matched_skus----------------');
    // console.log('now_select',now_select);
    // console.log('almost_matched_skus',matched_skus_array);
    return matched_skus_array;
}
function get_can_use_buttons(_skus){
    var can_use_buttons = [];
    _skus.forEach(one_sku=>{
        for(var attr_name in one_sku.attr){
            can_use_buttons.push(attr_name+'-'+one_sku.attr[attr_name]);
        }
    });
    can_use_buttons = array_uniq(can_use_buttons);
    return can_use_buttons;
}